//给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 
//
// 你必须在 原地 旋转图像，这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。 
//
// 
//
// 示例 1： 
// 
// 
//输入：matrix = [[1,2,3],[4,5,6],[7,8,9]]
//输出：[[7,4,1],[8,5,2],[9,6,3]]
// 
//
// 示例 2： 
// 
// 
//输入：matrix = [[5,1,9,11],[2,4,8,10],[13,3,6,7],[15,14,12,16]]
//输出：[[15,13,2,5],[14,3,4,1],[12,6,8,9],[16,7,10,11]]
// 
//
// 
//
// 提示： 
//
// 
// n == matrix.length == matrix[i].length 
// 1 <= n <= 20 
// -1000 <= matrix[i][j] <= 1000 
// 
//
// 
//
// Related Topics 数组 数学 矩阵 👍 1694 👎 0


package LeetCode.editor.cn;

import java.util.Arrays;

/**
 * @author ldltd
 * @date 2023-08-10 15:47:00
 * @description 48.旋转图像
 */
public class RotateImage{
	 public static void main(String[] args) {
	 	 //测试代码
	 	 Solution solution = new RotateImage().new Solution();
		  int[][] mat={{1,2,3},{4,5,6,},{7,8,9}};
		solution.rotate(mat);
		 System.out.println(Arrays.toString(mat));
	 }
	 
//力扣代码
//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
    public void rotate(int[][] matrix) {
		//t,m是临时变量
		int n = matrix.length,t=0,m=0;
		//一层一层的遍历，一共要遍历n/2层
		for (int i = 0; i <n/2; i++) {
			//每层遍历n-2*i-1个方块
			for (int j = i; j < n-i-1; j++) {
				//当前方块的坐标上一个位置
				t=matrix[n-j-1][i];
				//每个方块旋转一圈
				for (int k = 0; k < 4; k++) {
					m=matrix[i][j];
					matrix[i][j]=t;
					//下一个坐标,顺便借用t来交换坐标
					t=i;
					i=j;
					j=n-1-t;
					t=m;
				}
			}
		}

	}
	/*用翻转代替旋转*/
	public void rotate1(int[][] matrix) {
		int n = matrix.length;
		// 水平翻转
		for (int i = 0; i < n / 2; ++i) {
			for (int j = 0; j < n; ++j) {
				int temp = matrix[i][j];
				matrix[i][j] = matrix[n - i - 1][j];
				matrix[n - i - 1][j] = temp;
			}
		}
		// 主对角线翻转
		for (int i = 0; i < n; ++i) {
			for (int j = 0; j < i; ++j) {
				int temp = matrix[i][j];
				matrix[i][j] = matrix[j][i];
				matrix[j][i] = temp;
			}
		}
	}

}
//leetcode submit region end(Prohibit modification and deletion)

}
